SessionManagerでEC2へアクセスしようとしたらEC2にs3:GetEncryptionConfigurationの実行権がないとエラーが出たので、対処法についてまとめてみた
どうもさいちゃんです。皆さんAWS Systems Manager Session Manager(以下、Session Managerと表記します。)使ってますか?
今回、Session ManagerでUbuntu OSのEC2インスタンスへ接続をしようとしたところ、エラーが出ていしまい、接続が出来ない事象に遭遇しました。本ブログではこの事象を解決するのにどのように対処したかのかについてまとめています。同じ事象でお困りの方の参考になればと思います。
Session Manager使用の際の前提条件と今回の構成
Session Managerに限らず、AWS Systems Mangaerの機能を利用するには下記の前提条件が必要です。
- 条件1:SSM Agentが対象インスタンスにインストールされている
- 条件2:SSM APIへの経路の確報
- 条件3:EC2に「AmazonSSMManagedInstanceCore」ポリシーをアタッチしている
上記については理解していたので、下記のような構成で今回はEC2を作成し、Session Managerへ接続する予定でした。
今回はUbuntu Serverを使用していました。Ubuntu ServerにはデフォルトでSSM Agentがインストールされているため、条件1はクリアしています。
EC2はプライベートサブネットに配置しています。SSM APIへはインターネット経由、もしくはVPCエンドポイント経由でのアクセスする必要があります。今回はNATGatewayを使用した、インターネット経由での通信を想定していたので、条件2もクリアしています。
EC2用のロールにも「AmazonSSMManagedInstanceCore」をアタッチしていたので、条件3もクリアしていました。
起きた事象
上記の条件でEC2へアクセスしようとすると、以下のようなエラーが出ました。
Your session has been terminated for the following reasons: Couldn't start the session because we are unable to validate encryption on Amazon S3 bucket.Error: AccessDenied: User: <EC2ロールARN> is not authorized to perform: s3:GetEncryptionConfiguration on resource: "arn:aws:s3:::sessionmanager-logs-xxxxx" because no identity-based policy allows the s3:GetEncryptionConfiguration action status code: 403
EC2用のIAMロールにS3バッケットへのs3:GetEncryptionConfiguration
の実行権がないというメッセージです。このS3バケットって何??と思い、調べてみることにしました。
原因
S3バケット名で気が付いた方もいらっしゃると思いますが、こちらのバケットはSession Managerのアクティビティログ記録用のバッケットです。
Session ManagerはEC2へアクセスした際のログをS3バケットに出力できます。詳しい設定方法について下記ブログで紹介されています。
S3へのログ記録にチェックをすると、デフォルトで「Allow only encrypted S3 buckets」の項目にチェックが入るようです。
これは、暗号化されたS3バケットのみをログ記録用バケットとして使用するか否かを設定する項目です。この項目にチェックが入っている場合に上記のような事象が発生する可能性があります。
s3:GetEncryptionConfiguration
はS3バケットの暗号化設定についての情報を取得するための権限で、暗号化されたバケットへのアクセスには必須の権限です。
そのほかにも、EC2にログをS3へ保存するためのs3:PutObject
や s3:PutObjectAcl
といった権限が必要でした。この部分を失念してしまっていました。
対処法
Session Manager側のログ記録設定を変更する
上記の対処法として一番簡単なのはSession Managerのログ設定の「Allow only encrypted S3 buckets」をオフにすることです。
Session Managerコンソールへアクセスし、設定タブを開き、編集します。
S3 loggingの項目からAllow only encrypted S3 bucketsのチェックを外します。
これでSSMのエラーは解消され、問題なくEC2操作はできますが、ログバケットを確認してみたところ、ログ記録自体がされていないようでした。
そもそもこの設定をオフにするだけでは、EC2へS3バケットへのアクセス許可を持たせていないので当たり前ですね。しかし、ここに対してのエラーは出ないようなので、一旦問題が解決したように見えます。
ログを出力したい場合は、EC2にログ記録バケットへのアクセス許可を付けてあげているかしっかり確認が必要そうです。
これでは、SessionManagerのログ記録設定をオンにしているのに保存が出来ていないので、根本的な解決になっていません。
そのため、下記でご紹介する方法でエラー解決をすることを強くお勧めします。
EC2のIAMロールを適切なものに設定する
EC2に設定しているIAMロールに下記のポリシーを追加してみます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObjectAcl",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::ログ記録用バケット名/プレフィックス/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetEncryptionConfiguration"
],
"Resource": "arn:aws:s3:::ログ記録用バケット"
}
]
}
今回はEC2SessionManagerLoggingPolicyという名前でポリシーを作成し、アタッチしました。
S3側のバケットポリシーでアクセス制限を行っている場合は、バケットポリシー側も修正してください。
本ブログでは、S3の設定に関しては今回のテーマとは異なるため、バケットポリシーの設定については割愛させていただきます。
これでエラーが消え、試しにlsコマンドを実行してみると、正常に動作していることが確認できました。
ここまで設定してあげてから、S3を確認すると、しっかりとログが記録されていました。
最後に
EC2を作成する際の権限周りの設定は特にややこしく難しい部分があると思います。
実際私も、検証用のEC2を作成する際に広めの権限を付与してしまっており、今までこちらのエラーに遭遇したことがありませんでした。
権限周りの設定に苦手意識がある方こそ、検証用のリソース作成からしっかりと最小権限を意識して付与してあげることで、より理解が深まり、権限エラーでハマる事が少なくなってくると思います。こちらのブログが同じ事象でお困りの方の役に立てば幸いです。